週刊 Automatineマガジン2. Changerを使う


概要

ゲーム作ってて、操作する対象がいて、アイテムとか敵キャラがあって、

じゃあ敵キャラに攻撃だ! おやっこの敵キャラ複数のプレイヤーから殴られてるぞ?!とかあって、

フラグを持って状態判断するのは簡単、、なんだが、


「フラグの数がアババババばばば」

「えっこれとこれどっち優先すんの?」

「排他ァァぁ!?? もしかして排他ですかァァァァ!!??」

とかがある。


Automatineはこの辺に対して、Changerというものをもって挑む。



基本概念

殴られて死んだなら「お前もう死んでるから、次の状態はこれな」っていう

次の状態のラベルをもらえば良くない?


というのが基本の概念。



フラグを立てるのではなく、

・君、次は死んだ状態に行くといいよ

みたいなのをもらう。



この発想のいいところ

フラグの上げ下げが必要ない。次の状態の候補をもらうだけ。



この発想の悪いところ

その変化の候補ってどこからもらうの?とかその辺



Autoに対して、Changer = 可能性の定義 を行う

Automatineでは、Autoという単位が「現在の状態すべて」を持つようになっている。」


また、各Timeline、TackにはConditionを振ることができる。



で、

このAutoに、


「こういう状態だったら次はこの状態(別のAuto)に変わる可能性があるよね」


ていうのを列挙していくことができる。


1.「Conditionの、Damage.無敵 が ないフレームであれば、ダメージを受けた状態になる可能性がある」

2.「Conditionの、Damage.無敵 が ないフレームであれば、ダメージを受けて死んだ状態になる可能性がある」


1がダメージ受け中状態に移り変わる可能性のある条件、

2がダメージを受けて死ぬ可能性のある条件。


Autoに定義できる状態のみで判断して、こんな風に書き出せるわけだ。

1をChangerToDamaged、

2をChangerToDead、みたいに、名前と「次どんな状態になるか」をつけて、このAutoに保存することができる。


で、これをChanger(変化させるもの)と呼ぶ。

Autoにこれらを定義できることで、「別のAutoから見て、どんな変化の候補があるか」というのが作り出せた。


実際に使うとしたらこんな感じ。



実用Changer

次みたいなシチュエーションで使える。


1.PlayerがMonsterを殴った!


2.PlayerはMonsterのAutoからChangerを取得、ダメージ与えてHPが0になるのを確認したので、ChangerToDead をMonsterのAutoに積む。

複数の可能性があるならそれら全部を返してもいい。


3.Monsterは自分の行動のタイミングで、自分のAutoに積まれたChangerから、自分が受け入れなければいけないものを見る。

「わーい俺の番だぞ~積まれてるのは、、あっ死んだぞっていうのが積まれてる、、俺死んだのか、、」


4.ここで、Monsterは「死んでる状態」に移行する。

ざっとこんな感じ。


この方法のいいところは、hpフラグの確認をしているのがPlayer=殴った側で、殴られた側に可能性を積むだけで、予約が済んでいること。

受けた側がHPを確認する必要すら無いかもしれない。


(ネットゲーとかで殺したどうのとかする場合、この判定をサーバ側でも行えばいい。間違ってもクライアント側だけでやっちゃダメ。)

(実装を分割して、判定はサーバからのみ、とかにすれば良い。)